gtkeventcontrollerkey: Add ::focus-in/out signals
authorCarlos Garnacho <carlosg@gnome.org>
Thu, 22 Mar 2018 17:32:19 +0000 (18:32 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 5 Apr 2018 17:26:55 +0000 (19:26 +0200)
And handle GDK_FOCUS_CHANGE events in order to emit those.

gtk/gtkeventcontrollerkey.c

index d1c4f52bc941a2e4fc9e481de0e05103a66f870b..3b2700a5e4f1a90a26284c01a396ebc0aa5990fb 100644 (file)
@@ -47,6 +47,8 @@ enum {
   KEY_RELEASED,
   MODIFIERS,
   IM_UPDATE,
+  FOCUS_IN,
+  FOCUS_OUT,
   N_SIGNALS
 };
 
@@ -77,6 +79,18 @@ gtk_event_controller_key_handle_event (GtkEventController *controller,
   guint16 keycode;
   guint keyval;
 
+  if (event_type == GDK_FOCUS_CHANGE)
+    {
+      gboolean focus_in;
+
+      if (gdk_event_get_focus_in (event, &focus_in) && focus_in)
+        g_signal_emit (controller, signals[FOCUS_IN], 0);
+      else
+        g_signal_emit (controller, signals[FOCUS_OUT], 0);
+
+      return FALSE;
+    }
+
   if (event_type != GDK_KEY_PRESS && event_type != GDK_KEY_RELEASE)
     return FALSE;
 
@@ -168,6 +182,20 @@ gtk_event_controller_key_class_init (GtkEventControllerKeyClass *klass)
                   0, NULL, NULL,
                   g_cclosure_marshal_VOID__VOID,
                   G_TYPE_NONE, 0);
+  signals[FOCUS_IN] =
+    g_signal_new (I_("focus-in"),
+                  GTK_TYPE_EVENT_CONTROLLER_KEY,
+                  G_SIGNAL_RUN_LAST,
+                  0, NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+  signals[FOCUS_OUT] =
+    g_signal_new (I_("focus-out"),
+                  GTK_TYPE_EVENT_CONTROLLER_KEY,
+                  G_SIGNAL_RUN_LAST,
+                  0, NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
 }
 
 static void